/*
结构体是一种复合类型 可以放各种不同的类型
基础类型  int  char float double
数组        int arr[]
指针        int * ptr
结构体      结构体嵌套
*/
#include <stdio.h>
#include <string.h>

/*
如何声明
    向程序中声明一个结构体类型  例如 int 就是一个类型 
如何定义
    结构体类型名  结构体名

如何访问

*/


// 声明的三种方式
// 声明方式 1     仅用于声明   不常用
struct student_data_1   
{
    int id;         // 学号 
    int age;        // 年龄
    char name[128]; // 姓名
};

// 声明方式 2     声明 + 定义   但是不常用
struct student_data_2
{
    int id;     // 学号 
    int age;    // 年龄
    char name[128]; // 姓名
} s1 , s2; // 定义了两结构体变量 可以直接使用

// 声明方式 3    声明 + 改名
typedef struct student_data_3
{
    int id;     // 学号 
    int age;    // 年龄
}student_data_3;


int main(int argc, char const *argv[])
{
    // 第一种声明方式 进行定义  不初始化
    struct student_data_1 s3; 

    // 不同声明方式  的定义方式有啥区别

    // 第二种声明方式 提前定义了两个结构体变量
    s1.id = 10;
    s2.id = 11;

    // 第三种声明方式  通过改名的方式   常用这一种方式  ✔
    student_data_3 s5;

    // 第一种声明方式 进行定义  初始化 方式1 
    struct student_data_1 s4 = {1 , 18 , "张三"};

    // 第一种声明方式 进行定义  初始化 方式2
    struct student_data_1 s5 = {.id = 2 , .age = 18 , "李四"};
    // 初始化 的方式 仅用于 进行定义的时候 用一次

    // 访问方式
    // 写入数据
    s4.id = 4;
    s4.age = 18;
    strcpy(s4.name , "唐三");
    // 读数据
    printf("学号:%d 年龄:%d 姓名:%s\n" , s4.id , s4.age , s4.name);

    
    
    return 0;
}



